Cấu hình Log4j Log4j

Log4j có thể được cấu hình[13] thông qua file cấu hình hoặc mã Java. File cấu hình có thể được viết dưới định dạng XML, JSON, YAML, hoặc file properties. File cấu hình này có 3 thàn phần chính: Bộ ghi (Logger), Bộ nối (Appender) và Bản mẫu (Layout). Cấu hình nhật ký bằng file có một lợi thế là việc ghi có thể tiến hành hoặc tạm ngưng mà không cần phải sửa đổi mã nguồn ứng dụng. Ứng dụng có thể cho phép chạy mà không cần phải ghi nhật ký đến khi xuất hiện lỗi, ví dụ như thế, và khi đó, việc ghi nhật ký lại được kích hoạt lại đơn giản bằng cách sửa đổi file cấu hình.

Bộ ghi (Loggers)[14] được dùng để chỉ ra tên của nơi xuất các thông điệp (message) mà quá trình ghi nhật ký tạo ra. Đây là tên mà ứng dụng Java nhận biết được. Mỗi Bộ ghi được cấu hình riêng biệt ở mức ghi (FATAL, ERROR, v.v.) mà nó đang thực hiện. Ở các phiên bản cũ của Log4j, nó được đề cập đến là thư mục (category) và mức ưu tiên (priority), nhưng nay nó được gọi tương ứng là bộ ghi và cấp độ. Mỗi Bộ ghi có thể gởi thông điệp ghi (log message) tới nhiều Bộ nối (Appenders).

Sản phẩm thật sự được tạo là bởi từ Bộ nối (Appenders).[15] Log4j cung cấp nhiều Bộ nối mà tên của chúng thể hiện phần nào tính năng, như FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender, và SMTPAppender. Logj 2 thêm các Bộ nối mới nhằm hỗ trợ ghi nhật ký vào Apache Flume, Java Persistence API, Apache Kafka, các hệ cơ sở dữ liệu NoSQL, tập tin ánh xạ dữ liệu (Memory-mapped file), tập tin truy cập ngẫu nhiên (Random Access file)[16] và điểm cuối ZeroMQ. Nhiều Bộ nối có thể sử dụng cho một Bộ ghi, như thế, một thông tin nhật ký có thẻ được ghi ra ở nhiều nơi khác nhau; ví dụ như trường hợp ghi thông tin nhật ký ra một tập tin cục bộ và tới một trình thu nhận thông qua socket trên một máy tính khác.

Bộ nối sử dụng Bản mẫu[17] để định dạng các mẫu nhật ký. PatternLayout là bản mẫu thông dụng để ghi nhật ký, bản mẫu này hỗ trợ ghi mỗi-lần-một-dòng, sử dụng chuỗi pattern tương tự như cách sử dụng hàm printf trong ngôn ngữ C / C++. Các Bản mẫu HTMLLayout và XMLLayout được sử dụng khi định dạng nhật ký với các cấu trúc HTML hoặc XML thuận tiện hơn. Log4j 2 cũng thêm các Bản mẫu cho định dạng CSV, Graylog Extended Log Format (GELF),[18] JSON, YAML và RFC-5424.[19]

Với Log4j 2, Bộ lọc (Filters)[20] được sử dụng để cấu hình để giúp việc kiểm soát chặt chẽ hơn mẫu nhật ký nào nên được xử lý bởi Bộ ghi nào và Bộ nối nào. Bên cạnh đó, ngoài việc lọc theo cấp độ và sử dụng biểu thức chính quy, Log4j 2 bổ sung các tính năng lọc theo tần suất mẫu nhật ký xuất hiện, lọc theo thời gian, lọc theo các đặc tính của sự kiện khi nhật ký khác như Markers hoặc Thread Context Map và lọc sử dụng ngôn ngữ kịch bản JSR 223.

To debug a misbehaving configuration:

  • In Log4j hai configurations set the status attribute to TRACE to send internal status logging output to standard out. To enable status logging before the configuration is found, use the Java VM property -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace.
  • In Log4j 1, use the Java VM property -Dlog4j.debug.

To find out where a log4j2.xml configuration file was loaded from inspect getClass().getResource("/log4j2.xml").

Có một dạng cấu hình cho Log4j được ngầm hiểu là "không được cấu hình" (unconfigured) hoặc "mặc định" (default), khi mà Log4j được sử dụng trong ứng dụng nền tảng Java nhưng lại thiếu cấu hình cho nó. Khi đó, stdout hiển thị cảnh báo rằng chương trình chưa được cấu hình, và đường dẫn tới URL của web site Log4j nơi thông tin chi tiết và cảnh báo được tìm thấy. Ngoài việc hiển thị cảnh báo này, ứng dụng sử dụng Log4j thiếu cấu hình chỉ ghi lại các mẫu nhật ký ở cấp độ ERROR hoặc FATAL vào stdout.

Ví dụ cho Log4j 2

<?xml version="1.0" encoding="UTF-8"?><Configuration status="trace" monitorInterval="60">  <Properties>    <Property name="filename">target/test.log</Property>  </Properties>   <Appenders>    <Console name="STDOUT">      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>    </Console>    <File name="file" fileName="${filename}">      <PatternLayout>        <pattern>%d %p %c{1.} [%t] %m%n</pattern>      </PatternLayout>    </File>  </Appenders>   <Loggers>     <!--          Các bộ ghi có không gian tên là 'org.springframework' chỉ ghi các mẫu nhật ký ở cấp độ "INFO" hoặc cao hơn;         nếu bạn gọi Bộ ghi sử dụng tên lớp (ví dụ: Logger.getLogger(AClass.class))         và nếu AClass thuộc về  gói org.springframework, nó cũng thuộc vào trường hợp này    -->    <Logger name="org.springframework" level="info" additivity="false" />    <!--        Ví dụ về Bộ lọc: với những bộ ghi thuộc không gian tên 'com.mycompany.myproduct',        các mẫu nhật ký thuộc cấp bậc "DEBUG" hay cao hơn có dữ liệu ThreadContextMap chứa        cặp khóa-giá trị (key-value) "test=123", cũng sẽ gởi mẫu nhật ký đến Bộ nối "STDOUT".    -->    <Logger name="com.mycompany.myproduct" level="debug" additivity="true">      <ThreadContextMapFilter>        <KeyValuePair key="test" value="123"/>      </ThreadContextMapFilter>      <AppenderRef ref="STDOUT"/>    </Logger>     <!--        Mặc định, tất cả mẫu nhật ký có cấp "TRACE" hoặc cao hơn sẽ được ghi lại.        Mẫu nhật ký sau đó sẽ được gởi tới bộ nối "file" và        mẫu nhật ký có cấp "ERROR" hoặc cao hơn sẽ được gởi tới bộ nối "STDOUT".    -->    <Root level="trace">      <AppenderRef ref="file"/>      <AppenderRef ref="STDOUT" level="error"/>    </Root>  </Loggers> </Configuration>

Ví dụ cho Log4j 1.2

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"><log4j:configuration>    <!--          bộ nối định ra đầu ra cho trình ghi nhật ký, là màn hình điều khiển hoặc là một tập tin nào đó;         tên cho bộ nối được chọn tùy ý.    -->    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern"                value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />        </layout>    </appender>     <!--          Bộ ghi ở thư mục 'org.springframework' chỉ ghi các mẫu nhật ký có cấp "INFO" hoặc cao hơn;         nếu bạn sử dụng các bộ ghi có bằng cách gọi tên của nó (ví dụ: Logger.getLogger(AClass.class))         và nếu AClass nằm trong gói org.springframework, nó cũng thuộc về thư mục này    -->    <logger name="org.springframework">        <level value="info"/>    </logger>    <!--          mọi thứ nằm trong Spring được xét ở cấp "INFO" nhưng với lớp          PropertyEditorRegistrySupport ta muốn ghi nhật ký ở cấp "DEBUG"     -->    <logger name="org.springframework.beans.PropertyEditorRegistrySupport">        <level value="debug"/>    </logger>     <logger name="org.acegisecurity">        <level value="info"/>    </logger>            <root>        <!--             Tất cả mẫu nhật ký có cấp "DEBUG" hoặc cao hơn sẽ được ghi lại, nếu không được định nghĩa riêng             tất cả thông điệp nhật ký sẽ được gởi tới bộ nối "stdout", nếu không được định nghĩa riêng        -->        <level value="debug" />        <appender-ref ref="stdout" />    </root></log4j:configuration>